社区
C++ 语言
帖子详情
关于给线程分配资源的问题?????
wudt
2008-05-11 09:17:44
1.当一个程序运行时,相当于开启一个进程,他有一些默认的线程,OS给进程分配甚么资源,线程有自己甚么独立的资源,他们共享线程的甚么资源,线程被谁调度,线程之间怎么切换。
2.在main函数中,调用一个函数时有甚么样的资源分配,如果你使用pthread等线程工具调用一个函数时会发生甚么资源分配?
我不要太详细,就是想知道当一个程序运行是,Os做了甚么,多线程做了甚么?
...全文
351
4
打赏
收藏
关于给线程分配资源的问题?????
1.当一个程序运行时,相当于开启一个进程,他有一些默认的线程,OS给进程分配甚么资源,线程有自己甚么独立的资源,他们共享线程的甚么资源,线程被谁调度,线程之间怎么切换。 2.在main函数中,调用一个函数时有甚么样的资源分配,如果你使用pthread等线程工具调用一个函数时会发生甚么资源分配? 我不要太详细,就是想知道当一个程序运行是,Os做了甚么,多线程做了甚么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的理解随着知识掌握的多少而扩充,似乎没有底的,我也就知道怎么多了 -_-
JavaScript是多
线程
还是单
线程
?
多
线程
要考虑
线程
之间的资源抢占,死锁,冲突之类一系列
问题
。JavaScript作为一门客户端脚本,貌似没有多
线程
的一些列
问题
。那么JavaScript是单
线程
还是多
线程
?通过查资料总结了JavaScript运行的原理。如下:一、为什么JavaScript是单
线程
?JavaScript语言的一大特点就是单
线程
,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个
线程
呢?这样能...
【操作系统】用户态
线程
和内核态
线程
有什么区别?
本文内容转载于“拉勾教育”的讲义,详细可看拉勾教育的课程。本人学习之余做做笔记,顺便当个搬运工。 目录 用户态
线程
和内核态
线程
有什么区别? 什么是用户态和内核态? 系统调用过程
线程
模型 用户态
线程
内核态
线程
用户态
线程
和内核态
线程
之间的映射关系 总结 用户态
线程
和内核态
线程
有什么区别? 这是一个组合型的
问题
,由很多小
问题
组装而成,比如:用户态和内核态是什么?用户级
线程
和内核级
线程
是一个怎样的对应关系?内核响应系统调用是一个怎样的过程? 什么是用户态和内核态? Kernel
什么是进程?什么是
线程
?进程与
线程
的区别?
目录 什么是进程?什么是
线程
? 为什么要有
线程
? 进程与
线程
的区别? 进程与
线程
的选择取决条件? 什么是进程?什么是
线程
? 进程:进程是并发执行程序在执行过程中资源分配和管理的基本单位(资源分配的最小单位)。进程可以理解为一个应用程序的执行过程,应用程序一旦执行,就是一个进程。每个进程都有自己独立的地址空间,...
什么是
线程
?进程和
线程
有什么联系?
如果把一个进程想象成是一个工厂,
线程
就是工厂中的若干个流水线。
线程
其实是包含在进程中的。 一个进程中可能含有多个
线程
。 每个
线程
都有一段自己要执行的逻辑(指令)或者说每个
线程
都是一个独立的“执行流”。 同一个进程中的很多
线程
之间,是共享了一些资源。 所谓的
线程
可以理解成是一种轻量级“进程”,也是一种实现并发编程的方式。 创建一个
线程
比创建一个进程成本低。 销毁一个
线程
比销毁一个进程成本也低,成本低的原因是:新创建一个
线程
,不需要给这个
线程
分配很多的资源,因为大部分资源都是和原来的
线程
共享的。如果新创建
什么是
线程
?什么是进程?为什么要有
线程
?有什么关系与区别?
什么是
线程
?什么是进程?为什么要有
线程
?有什么关系与区别? 进程: 程序执行时的一个实例 每个进程都有独立的内存地址空间 系统进行资源分配和调度的基本单位 进程里的堆,是一个进程中最大的一块内存,被进程中的所有
线程
共享的,进程创建时分配,主要存放 new 创建的对象实例 进程里的方法区,是用来存放进程中的代码片段的,是
线程
共享的 在多
线程
OS 中,进程不是一个可执行的实体,即一个进程至少创建一个
线程
去执行代码
线程
: 进程的一个执行路径 CPU 调度和分派的基本单位
线程
本身
C++ 语言
64,636
社区成员
250,540
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章