在客户/服务器模式中,服务器程序使用进程池,如何进行资源的调度?

bicbasic 2000-07-11 12:12:00
比如,我的服务器程序预先起10个子进程,如果同时来了15个服务,这时需要再起几个
子进程,我的问题是,我如何知道我的10个子进程现在是忙是闲?如果所有进程都忙,
我需要增加子进程,如果大部分进程都空闲,我需要下调一部分子进程,这是进程调度的问题,请高手指教。
...全文
199 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pbi 2000-07-18
  • 打赏
  • 举报
回复
如果是在NT上进行多线程的服务器程序开发,可以使用NT的IO完成端口(IOCompletionPort),该对象可以解决线程的调度问题。
hibor 2000-07-18
  • 打赏
  • 举报
回复
我这段时间也在写一个C/S模式的程序的服务器端,先前也遇到了和你一样的问题。许多用户一起发出请求时原来是来一个响应一次,后来在测试1000个用户时发现CPU再也无能为力了,于是我改变策略。
在配置文件里设置了一个最大用户数(因为我知道任何系统都有他的负载极限)当然不只是1000个,在启动时我会预先启动一批服务线程大约是25%这些都放置于一个全局的空闲资源量表里(链表或是数组一定要进行互次访问)当来一个请求之后我会从那个空闲资源表里取一个出来,若没有了多余的了则根据当前的已运行的服务线程数来决定是不是继续启动线程。若实在没有了则只好和这位用户说BYE BYE。
在每个线程结束之后将其再次放到空闲队列里等待下一个用户请求,要注意一点对于空闲的线程调度如取出,放入等一定要是互次式访问,另外还要考虑一点一定要注意服务器的可管理性,就是能够在第三方进行控制(手动控制或是按一个策略自动控制)来保持服务器尽可能的始终运行在稳定的环境中。
欢迎来信共同探讨服务器的设计技巧inused@163.net
vagabond 2000-07-12
  • 打赏
  • 举报
回复
使用动态进程调度服务,非常的复杂。我建议使用静态的进程调度。在实际的使用中,预先指定进程数,基本可以满足你的实际要求。当所有的进程忙时,可以让一些服务稍侯。

如果坚持要使用动态进程调用,则以下的建议供参考:
1。建立超级进程,进行调用管理。
2。服务进程和超级进程可使用信号灯和共享内存通信。即服务进程都阻塞在accept,由
系统进行调度。当服务进程激活时,先通知超级进程,再进行服务。当服务完成时,也通知超级进程。
3。超级进程通过2知道所有的进程的工作状态。可以采用以下的策略进行管理:
1)如果长时间服务进程的工作不饱满,可以削减服务进程数,(所有的服务进程都通过fork由超级进程派生,可以直接发SIGKILL,或自己定义一个信号)
2)当长时间工作饱满,则增加服务进程
3)应设置最小服务进程和最大服务进程。
4)建议可以使用pthread库,采用线程技术,这样在性能上要好一些。
bicbasic 2000-07-11
  • 打赏
  • 举报
回复
我的问题是,每个子进程都是一个叠代服务器,如何动态的调度子进程的个数,使得本服务器效率高,耗资源少?
WHQ 2000-07-11
  • 打赏
  • 举报
回复
如果来了一千个请求你也要是创建一千个进程?这样对资源的消耗及性能的降低是不是太大了?
我觉得比较合理的是先创建固定数目的进程(线程),并且把所有的客户请求都放入到一个大家共享的队列中,所有这些进程(线程)不停地从这个队列中取出用户的请求并进行处理(当然队列为空时应该让所有进程(线程)阻塞以减少对系统资源的消耗)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧