关于给线程分配资源的问题?????

wudt 2008-05-11 09:17:44
1.当一个程序运行时,相当于开启一个进程,他有一些默认的线程,OS给进程分配甚么资源,线程有自己甚么独立的资源,他们共享线程的甚么资源,线程被谁调度,线程之间怎么切换。
2.在main函数中,调用一个函数时有甚么样的资源分配,如果你使用pthread等线程工具调用一个函数时会发生甚么资源分配?

我不要太详细,就是想知道当一个程序运行是,Os做了甚么,多线程做了甚么?
...全文
351 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
masol 2008-05-14
  • 打赏
  • 举报
回复
线程的系统开销是非常小的。你可以看看linux的代码。响应cpu中断之后,按照调度策略选择下一个线程,如果在同一个进程中,调度所需要做的工作就是将寄存器设置一遍,这个在几十个指令周期内就可以完成,完全可以忽略不计。不过即便这么小的开销,服务器端用每线程一个请求来处理的模式是否合理,也要看你的需求了。这个方式适合请求之间彼此无关,而且不面向连接的服务比较适合(比如http)。对于面向连接的如果这么处理将是一个噩梦,尤其请求之间彼此依赖.(比如xmpp以及所有网游).
最后,高级程序的语句是不会自动变成并发的。你可以通过两种办法来让他并发。
第一就是自己控制着写一些多线程(可以自己用api或用boost thread/thread pool,pthread等库),这个方式创建的线程的最小单元是函数,也就是一个函数的实例最多只能在一个线程中执行。
还有一个就是随着多核CPU普及出来的OpenMP(www.openmp.org),这是一个中立的组织。包括gcc/vc在内的多个编译器已经做了初步支持。比如在vc中,你可以写
#pragma omp for
for (i=0; i<=1000; ++i) {
#pragma omp atomic
nSum += i;
}
上边这段代码是多线程执行的,编译器帮你做了需要的处理。这不同于第一种传统方式,可以去omp看看。
masol 2008-05-12
  • 打赏
  • 举报
回复
线程是最小CPU调度单元,与资源无关。资源是与进程相关的。os启动一个进程,主要就是分配内存映射符表,确保内存有独立的地址空间。(不理解的话,可以参考386保护模式,自从386保护模式推出之后,一直到今天,cpu的内存管理没有什么大的变化,核心都是保持着逻辑-物理两层映射关系,理解了这个,对于virtualAlloc/VirtualFree;MemoryMap(linux下是mmap)系列函数以及所谓"虚拟"内存就非常容易理解了,这是整个系统的核心模式)。然后,由于有IPC(Inter-process communication)的需求,还要有句柄的继承等初始化动作。
最后,对于线程而言,由于"所有"资源对于所有线程而言都是“裸露”的,就是一个可访问,另外的一个都可访问,而程序本质是利用存储器将上下文无关的CPU变为上下文相关,这就涉及一个同步的问题,最重要的就是内存同步,现代的操作系统都会支持线程存储(TLS:thread local storage)的概念,就是每个线程可以关联一些存储区供自己独立使用。
最后,C++是一个高级语言,换言之,不能保证语句是原子的,因此,线程切换有可能发生在一个语句之间。
wudt 2008-05-12
  • 打赏
  • 举报
回复
意思是一个高级程序的语句可能最后在运行时是并发的?
具体点我的想法是,例如你一个C++程序,一个无限循环main函数执行起来,可以看作一个进程起来,如果这个是RPC程序的SERVER端,它应当为每个连接的Client端开启一个线程,可以给个分析吗?分析一下这个线程的开启都涉及到什么,是不是无论你的程序中使用什么工具开启它,最后编译后的可执行代码都是无差别的,和系统用来并行执行的都一样?
过去的我 2008-05-12
  • 打赏
  • 举报
回复
每个线程都有tib,里面保存有context,线程上下文,就是寄存器的值,切换时重新加载进去就行了,对os的理解随着知识掌握的多少而扩充,似乎没有底的,我也就知道怎么多了 -_-

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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