笔试题集锦(1)
来源:互联网 发布:javascript弹出输入框 编辑:程序博客网 时间:2024/06/03 03:35
感谢:http://blog.csdn.net/hustcqb/article/details/12220549
7 Unix系统中,哪些可以用于进程间的通信?()
A.Socket B.共享内存 C.消息队列 D.信号量
关于这个问题,可参考两个链接,ABCD应该都可以。http://www.cnblogs.com/ManMonth/archive/2010/09/19/1831072.html
18 同一进程下的线程可以共享以下?(BD)
A. stack B.data section C.register set D.file fd(文件描述符)
参考:http://laiyuanyuan7.blog.163.com/blog/static/15274321201241191321666/线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。
1.线程ID
每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标
由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线
堆栈是保证线程独立运行所必须的。
线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程
4.错误返回码
由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用
所以,不同的线程应该拥有自己的错误返回码变量。
5.线程的信号屏蔽码
由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自
6.线程的优先级
由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参
数,这个参数就是线程的优先级。
涉及多线程程序涉及的时候经常会出现一些令人难以思议的事情,用堆和栈分配一个变量可能在以后的执行中产生意想不到的结果,而这个结果的表现就是内存的非法被访问,导致内存的内容被更改。
理解这个现象的两个基本概念是:在一个进程的线程共享堆区,而进程中的线程各自维持自己堆栈。
另一运行机制就是如果声明一个成员变量如 char Name[200],随着这段代码调用的结束,Name在栈区的地址被释放,而如果是 char * Name = new char[200]; 情况则完全不同,除非显示调用delete否则 Name指向的地址不会被释放。
在B中如果用栈区 即采用临时变量的机制分配声明V和堆区,而者的结果是不同的。如果用栈区,如果变量地址为Am1-Am2这么大,退出B调用时候这段地址被释放,C函数可能将这段内存改写;这样当D执行的时候,从内存Am1-Am2中读取的内容就是被改过的了。
而如果用New(堆)分配,则不会出现那样的情况,因为没有显示对用delete并且堆对于线程共享,即2线程可以看到1线程在堆里分配的东西,所以不会发生误写。
这个问题是笔者在公司实习的时候发现的,因为当时刚刚涉及多线程程序设计,操作系统中如此简单的话题困扰笔者很久,希望可以对初涉C++多线程的读者有所帮助! 2)如果两个线程共享堆,而且都有可能执行内存分配和释放操作,就必须进行同步保护,这个和C类,R类,T类没有关系。你看到的例子两个线程应该是使用各自的堆。
在 windows 等平台上,不同线程缺省使用同一个堆,所以用 C 的 malloc (或者 windows 的 GlobalAlloc)分配内存的时候是使用了同步保护的。如果没有同步保护,在两个线程同时执行内存操作的时候会产生竞争条件,可能导致堆内内存管理混乱。比如两个线程分配了统一块内存地址,空闲链表指针错误等。
Symbian 的线程一般使用独立的堆空间。这样每个线程可以直接在自己的堆里分配和释放,可以减少同步所引入的开销。当线程退出的时候,系统直接回收线程的堆空间,线程内没有释放的内存空间也不会造成进程内的内存泄漏。
但是两个线程使用共用堆的时候,就必须用 critical section 或者 mutex 进行同步保护。否则程序崩溃时早晚的事。如果你的线程需要在共用堆上无规则的分配和释放任何数量和类型的对象,可以定制一个自己的 allcator,在 allocator 内部使用同步保护。线程直接使用这个 allocator 分配内存就可以了。这相当于实现自己的 malloc,free。但是更建议你重新审查一下自己的系统,因为这种情况大多数是不必要的。经过良好的设计,线程的本地堆应该能够满足大多数对象的需求。如果有某一类对象需要在共享堆上创建和共享,这种需求是比较合理的,可以在这个类的 new 和 delete 上实现共享保护。
20 如何减少换页错误?()
A 进程倾向于占用CPU
B 访问局部性(locality of reference)满足进程要求
C 进程倾向于占用I/O
D 使用基于最短剩余时间(shortest remaining time)的调度机制
参考:(D)
http://blog.csdn.net/boluo1982107/article/details/4235903
http://baike.baidu.com/view/1463694.htm
21 递归函数最终会结束,那么这个函数一定?(B)
A 使用了局部变量
B 有一个分支不调用自身
C 使用了全局变量或者使用了一个或多个参数
D 没有循环调用
23 同步机制应该遵循哪些基本准则?(ABCD)
A.空闲让进 B.忙则等待 C.有限等待 D.让权等待
(基本知识!!!)
24 进程进入等待状态有哪几种方式?(ABC)
A CPU调度给优先级更高的线程
B 阻塞的线程获得资源或者信号
C 在时间片轮转的情况下,如果时间片到了
D 获得spinlock未果
等待状态即阻塞状态,进程有三大基本状态:就绪状态、执行状态、阻塞状态(等待状态)。
引入的新状态:挂起状态。
百度百科:http://baike.baidu.com/link?url=GNoCZtFykejhomoZOPQ6hxZGbZYiyTI12udmvjgrFNJWKu79TfYxMy24o3mHH92JahVO-_9N227ElF2EqkPQ7K
进程在操作系统中可以定义为暂时被淘汰出内存的进程,机器的资源是有限的,在资源不足的情况下,操作系统对在内存中的程序进行合理的安排,其中有的进程被暂时调离出内存,当条件允许的时候,会被操作系统再次调回内存,重新进入等待被执行的状态即就绪态,系统在超过一定的时间没有任何动作。引起挂起状态的原因:
(1)终端用户请求(2)父进程请求(3)负荷调节的需要(4)操作系统的需要。
为了管理的需要,还存在两种比较常见的状态:创建状态 、 终止状态。
spinlock - 自旋锁
百度百科:http://baike.baidu.com/view/1250961.htm
原理:跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。(详细见链接)
25 设计模式中,属于结构型模式的有哪些?(BC)
A 状态模式 B 装饰模式 C 代理模式 D 观察者模式
- 笔试题集锦(1)
- 笔试题集锦(1)
- C++ 笔试题集锦(1)
- 单片机笔试题集锦1
- 笔试题集锦(2)
- 笔试题集锦(2)
- java笔试题集锦(一)
- C++ 笔试题集锦(2)
- Java笔试题集锦
- Java笔试题集锦
- 金山笔试题集锦
- Java笔试题集锦
- Java笔试题集锦
- Java笔试题集锦
- 计算机笔试题集锦
- Java笔试题集锦
- Java笔试题集锦
- Java笔试题集锦
- MongoDB实战-电子书
- iOS7 隐藏status bar
- c/s模式下的文字滚动
- sqlplus与shell互相传值
- C++ extern
- 笔试题集锦(1)
- C/C++ 获取当前所有逻辑驱动器的根驱动器路径
- 根据时间转动的圆形progressbar
- NuGet的组成
- java实现栈(数组方式)
- 日照的软件公司
- Copy List with Random Pointer
- Flex 4里的fx、mx以及s命名空间
- Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程