b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

linux 多线程面试题_linux 进程线程_linux 线程 进程

电脑杂谈  发布时间:2019-07-19 11:08:31  来源:网络整理

linux 进程线程_linux 多线程面试题_linux 线程 进程

还有不会的小伙伴,可以参见这两篇文章学习下:excel:https://my.oschina.net/u/3041656/blog/819892 xml:https://my.oschina.net/u/3041656/blog/819895。转载自:https://blog.csdn.net/javazejian/article/details/51932554。转载自:https://blog.csdn.net/a19881029/article/details/26348627。

第一题:线程的基本概念、线程的基本状态及状态之间的关系?

线程,有时称为轻量级进程,是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、数据段和其他操作系统资源(如打开文件和信号)。

线程有四种状态:新生状态、可运行状态、被阻塞状态、死亡状态。状态之间的转换如下图所示:

第二题:线程与进程的区别?

1、 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。

2、 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。

3.进程之间彼此独立,但同一进程下的各个线程之间共享程序的内存空间(包含代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见。b)子线程未与父线程分离,则资源无法释放,造成了资源浪费和系统臃肿(这种情况,我看有些资料上说系统也能自动释放子线程的资源,如关闭描述符,释放内存空间等等,但个人做过一些测试,比如在子线程中分配很多空间等,进程退出后,top查看内存状态时还存在)。多线程资源控制,由于线程之间共享进程中的资源,所以同一进程中的多个线程的通讯的重心之一是对共享的资源进行控制,例如当多个线程同时使用进程某个资源时,有可能需要采用互斥/同步等手段保证资源被正确操作,在采用互斥/同步手段时候,需要避免产生死锁的情况。

多线程资源控制,由于线程之间共享进程中的资源,所以同一进程中的多个线程的通讯的重心之一是对共享的资源进行控制,例如当多个线程同时使用进程某个资源时,有可能需要采用互斥/同步等手段保证资源被正确操作,在采用互斥/同步手段时候,需要避免产生死锁的情况。当然,要想实现线程,没有核心对多进程(其实是轻量级进程)共享数据段的支持是不行的,因 此,do_fork()提供了很多参数,包括clone_vm(共享内存空间)、clone_fs(共享文件系统信息)、clone_files(共享文 件描述符表)、clone_sighand(共享信号句柄表)和clone_pid(共享进程id,仅对核内进程,即0号进程有效)。2. 互斥量(mutex),信号灯(semaphore),事件(event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。

5、 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。

第三题:多线程有几种实现方法,都是什么?

1. 继承 Thread 类

2. 实现 Runnable 接口再 new Thread(YourRunnableOjbect)

第四题:多线程同步和互斥有几种实现方法,都是什么?

线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。

原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或pthread函数库)保证了如果一个线程锁定了一个互斥量,没有其他线程在同一时间可以成功锁定这个互斥量。互斥量是内核变量,可以跨进程使用。fullscreen变量非常明显了.如果我们程序运行在全屏模式下,fullscreen的值会是true,如果运行在窗体模式下,fullscreen的值是false.要注意的是,该变量要定义为全局,这样的话所有函数都知道程序是否运行在全屏模式下.。

第五题:多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明。

线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。

多线程资源控制,由于线程之间共享进程中的资源,所以同一进程中的多个线程的通讯的重心之一是对共享的资源进行控制,例如当多个线程同时使用进程某个资源时,有可能需要采用互斥/同步等手段保证资源被正确操作,在采用互斥/同步手段时候,需要避免产生死锁的情况。需要注意的是在使用互斥锁的过程中很有可能会出现死锁:两个线程试图同时占用两个资源,并按不同的次序锁定相应的互斥锁,例如两个线程都需要锁定互斥锁1和互斥锁2,a线程先锁定互斥锁1,b线程先锁定互斥锁2,这时就出现了死锁。自旋锁适用于单个线程不会占用资源太久的情况(因为一个线程占有资源期间,其他线程在循环检测浪费cpu)。

1

2、以下多线程对int型变量x的操作,哪几个不需要进行同步(D)

A. x=y; B. x++; C. ++x; D. x=1;

详见:后面系列解析

3、多线程中栈与堆是公有的还是私有的 (C)

A:栈公有, 堆私有

B:栈公有,堆公有

C:栈私有, 堆公有

D:栈私有,堆私有

4、临界区(Critical Section)和互斥量(Mutex)

两者都可以用于同一进程中不同子线程对资源的互斥访问。

互斥量是内核对象,因此还可以用于不同进程中子线程对资源的互斥访问。

互斥量可以很好的解决由于线程意外终止资源无法释放的问题。

讨论到这里,其实怎么做到多线程安全也比较明朗了,关键字是atomicity(原子性),只要做到原子性,小到一个primitive type变量的访问,大到一长段代码逻辑的执行,原子性能保证代码串行的执行,能保证代码执行到一半的时候,不会有另一个线程介入。解决问题的关键就是要容易出现问题的代码的原子性,所谓原子性就是指:当a线程在执行某段代码的时候,别的线程必须等到a线程将该段代码执行完毕后,才能执行该代码。为了实现这个需求,我们需要首先拿到全局并发队列(或自己开启一个子线程)来执行耗时的操作,然后在其完成block中拿到全局串行队列来执行ui刷新的任务。

inttally = 0;//glable

voidThreadProc()

{

for(inti = 1;i <= 50;i++)

tally += 1;

}

答:[50,100]

happens-before的通用模式 线程a 线程b 程序顺序规则写共享变量 某个桥梁规则写共享变量xxx xxx 读共享变量 读共享变量 程序顺序规则 锁规则的案例class synchronizedexample int a 0。先运行程序 a,然后立即运行程序 b,根据打印你可以清楚的发现,当程序 a 刚运行的时候,程序 b 一直处于等待中,当大概10秒过后,程序 b 便打印出了 appb:ok 的输出,以上便实现了两上不同程序之间的互斥。java线程之间的通信总是隐式进行 java并发模型—硬件视图 内存空间 共享对象 共享对象 共享对象 内存中的jvm 对象 程之间共享 线程1 线程2 处理器a 处理器b 处理器c 处理器d java并发模型—操作系统视图 jvm进程 hotspot vm中, java线程被 java线程 java线程 java线程 映射为本地操作系 统线程 linux kernel 操作系统内核 直接调度java 线程给可用的cpu处理器a 处理器b 处理器c 处理器d 编译器和处理器喜欢不择手段的冒险源代码 编译器优化 指令级并行 内存系统的 最终执行的 的重排序 的重排序 重排序 指令序列 编译器的 重排序 重排序 指令级并行的 处理器的 重排序 重排序 内存系统的 重排序 顺序一致性内存模型的原型结构 处理器a 处理器b 处理器c 处理器c a3 b2 d1 程序顺 a2 b1 c3 d2 序不变 a1 c2 每个内存 c1 单元一个 fifo队列内存单元 1 2 3 4 5 6 7 8 9 10 11 12 13 … … n顺序一致性内存模型的程序员视图 线程 线程 线程 线程 … 2 3 n 1 内存 顺序一致性内存模型的2 大特性 特性2 线程a 的程序顺序 操作的执行整体上无序,但两个线程 都只能看到这个执行顺序。

信号量控制线程数量:这里我用最通俗的话来讲解怎么用信号量控制线程数量,信号量首先我们可以把他当做一个容器,那么我们给他指定的多少个空间(线程数),当我们启动一个线程(给信号量资源数减一),那个空间就让他少一个,我们结束一个线程那个空间就多一个(给信号量资源数加一),当空间全部没有了的话,我们此时是在给信号量资源数减一的代码处,那么它就不会减,因为没有空间了,在这时他就会阻塞在那个代码处,等待到有空间能减一时,就自动通过并减一,如此循环那么线程数始终不会超过我们设定的最大线程数——信号量的这个解释只适用于控制线程数,其实信号量并不完全是这样(详细自己百度)。3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的pv操作相同。为每一个共享资源创建一个lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁,则当前线程需等待其被释放),待资源访问完后,再调用release方法释放锁:。

#include“stdafx.h”

#include“stdio.h”

#include“stdlib.h”

#include<iostream>

#include<string>

#include<stack>

#include<windows.h>

#include<process.h>

usingnamespacestd;

constintTHREAD_NUM=10;

HANDLEga,gb,gc;

unsignedint__stdcallFunA(void*pPM)

{

Sleep(50);//someworkshouldtodo

printf(“A\n”);

ReleaseSemaphore(gb,1,NULL);//递增信号量B的资源数

return0;

}

unsignedint__stdcallFunB(void*pPM)

{

Sleep(50);//someworkshouldtodo

printf(“B\n”);

ReleaseSemaphore(gc,1,NULL);//递增信号量C的资源数

return0;

}

unsignedint__stdcallFunC(void*pPM)

{

Sleep(50);//someworkshouldtodo

printf(“C\n”);

ReleaseSemaphore(ga,1,NULL);//递增信号量A的资源数

return0;

}

intmain()

{

//初始化信号量

如果用户的请求被验证通过了,但是他请求的url是否允许用户访问了呢,这就用到了授权.可以通过应用程序配置文件来进行授友也可以在程序中使用代码来验证用户是否有资格访问该资源.如果授权失败,则 asp.net 将用户重定向到登录页.如果用户已被授权,则将允许用户访问受保护资源.。 g_hsemaphore = createsemaphore(null, 1, 1, "semaphore")。wsc的计数值能够从细粒度层次直观反映当前cache set的存储压力特性:一方面,若处理器核在本地目标set中的访问命中越频繁,则说明当前cache set中的数据块对片上末级cache命中率的贡献越大.另一方面,从数据重用特性的角度考虑,wsc值越大,表明该set中的数据块被频繁访问,或者访存序列经常命中lru栈底部,数据重用时表现出的lru栈距离较长[8]. 在wsc数值更新过程中,不但考虑了各set上的访问命中频繁程度,还考虑了访存序列的lru栈距离特性,根据数据块被命中时所处的lru栈位置不同,在计数器值增加时分别赋予不同的权值[10].对于n路组相联cache而言,若命中当前set的mru块,则该set对应的加权饱和计数器增加1,依次类推,命中lru块时,该set对应的wsc自加n.此外,由于cspf允许牺牲块通过溢出操作保存在远程同级cache set中,如果命中远程溢出块,说明其数据重用性较高,因此在更新wsc时赋予更大的权值,数值为cache组相联度的两倍.。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-114181-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...