线程

Linux内核多线程(四)

我怕爱的太早我们不能终老 提交于 2020-03-11 18:59:43
自己创建的内核线程,当把模块加载到内核之后,可以通过:ps –ef 命令来查看线程运行的情况。通过该命令可以看到该线程的pid和ppid等。也可以通过使用kill –s 9 pid 来杀死对应pid的线程。如果要支持kill命令自己创建的线程里面需要能接受kill信号。这里我们就来举一个例,支持kill命令,同时rmmod的时候也能杀死线程。 #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/param.h> #include <linux/jiffies.h> #include <asm/system.h> #include <asm/processor.h> #include <asm/signal.h> #include <linux/completion.h> // for DECLARE_COMPLETION() #include <linux/sched.h> #include <linux/delay.h> // mdelay() #include <linux/kthread.h> MODULE_LICENSE("GPL"); static DECLARE_COMPLETION(my_completion); static

想成为顶尖 Java 程序员?先过了下面这些问题!

被刻印的时光 ゝ 提交于 2020-03-11 17:53:39
作者:rowkey https://zhuanlan.zhihu.com/p/31552882 一、数据结构与算法基础 说一下几种常见的排序算法和分别的复杂度。 用Java写一个冒泡排序算法 描述一下链式存储结构。 如何遍历一棵二叉树? 倒排一个LinkedList。 用Java写一个递归遍历目录下面的所有文件。 二、Java基础 接口与抽象类的区别? Java中的异常有哪几类?分别怎么使用? 常用的集合类有哪些?比如List如何排序? ArrayList和LinkedList内部的实现大致是怎样的?他们之间的区别和优缺点? 内存溢出是怎么回事?请举一个例子? ==和equals的区别? hashCode方法的作用? NIO是什么?适用于何种场景? HashMap实现原理,如何保证HashMap的线程安全? JVM内存结构,为什么需要GC? NIO模型,select/epoll的区别,多路复用的原理 Java中一个字符占多少个字节,扩展再问int, long, double占多少字节 创建一个类的实例都有哪些办法? final/finally/finalize的区别? Session/Cookie的区别? String/StringBuffer/StringBuilder的区别,扩展再问他们的实现? Servlet的生命周期? 如何用Java分配一段连续的1G的内存空间

MYSQL 逻辑架构

我们两清 提交于 2020-03-11 17:48:56
MYSQL 逻辑架构 思维导图 前言 》 Mysql并非尽善尽美,但足够灵活,能适应高要求环境,如Web应用。 》 Mysql在众多平台上运行良好,支持多种数据类型,但不支持对象类型(Mongodb支持) 》 Mysql的存储引擎可以基于表建立,以满足对数据存储,性能,特征及其他特性的各种需要。 架构逻辑视图 每个虚线框为一层,总共三层。 第一层,服务层(为客户端服务):为请求做连接处理,授权认证,安全等。 第二层,核心层:查询解析,分析,优化,缓存,提供内建函数;存储过程,触发器,视图。 第三层,存储引擎层,不光做存储和提取数据,而且针对特殊数据引擎还要做事务处理。 连接管理与安全性(第一层 服务层) > 处理流程 Δ 每个连接的查询都在一个进程中的线程完成。 Δ 服务器负责缓存线程,所以服务层不需要为每个连接新建线程。 > 认证流程    优化与执行 > 在解析查询之前,服务器会“询问”是否进行了查询缓存(只能缓存SELECT语句和相应结果)。缓存过的直接返回结果,未缓存的就需要进行解析查询,优化,重新执行返回结果。 > 解析查询时会创建一个内部数据结构(树),然后对其进行各种优化。 > 优化:重写查询,决定查询的读表顺序,选择需使用的索引。 思维导图 前言 》 Mysql并非尽善尽美,但足够灵活,能适应高要求环境,如Web应用。 》 Mysql在众多平台上运行良好

Java内存模型之happens-before和重排序

非 Y 不嫁゛ 提交于 2020-03-11 17:43:56
重排序 在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,满足以下两个条件: 在单线程环境下不能改变程序运行的结果; 存在数据依赖关系的不允许重排序 happens - before 原则定义 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。 两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。 原则规则 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作; 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作; volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作; 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C; 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作; 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生; 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread

happens-before规则

我的未来我决定 提交于 2020-03-11 17:38:08
happens-before规则 程序次序法则:线程中的每个动作A都happens-before于该线程中的每个动作B,其中,在程序中,所有动作B都出现在都能出现在A之后。 监视器锁法则:对一个监视器的解锁happens-before于每一个后续对同一个监视器锁的加锁。 volatile变量法则:对volatile域的写入操作happs-before于每一个后续对同一个域的读写操作。 线程启动法则:在一个线程里,对Thread.start的调用会happens-before于每一个启动线程的动作。 线程终结法则:线程中的任何动作都happens-before于其他线程检测到这个线程已经终结、或者从Thread.join调用中成功返回,或Thread.isAlive返回false。 中断法则:一个线程调用另一个线程的interrupt happens-before于被中断的线程发现中断。 终结法则:一个对象的构造函数的结束happens-before于这个对象finalize的开始。 传递性:如果A happens-before于B,且B happens-before于C,则A happens-before于C。 PS . volatile修饰的变量,不仅具有可见性,还表示禁止指令重排序优化。 来源: oschina 链接: https://my.oschina.net/u

单核CPU、并行、进程、线程、纤程、协程出现必要性解析

懵懂的女人 提交于 2020-03-11 16:51:20
并发/并行 从物理基础元素角度来看,当只有一个CPU时,执行一个程序这个程序就会一直占用CPU,直到程序运行结束。 如果这个程序的运行过程中,需要用到CPU的部分很快就结束了,程序的其他环节(比如IO阻塞等)正在占用时间,此时CPU是空置的。 于是就有了并发。 并发的不足 并发执行加速了对CPU的使用效率,也带来了问题。 程序A运行到一半,程序B进来抢占CPU,程序A的 中间状态 /内存/变量怎么办? 因此,在同一个CPU里的并发需要处理好 上下文切换 的问题。 进程的出现 让CPU处理两个程序,就像男女结婚一样。两人结婚并不是两个人凑在一起过日子,而是两个家庭在进程资产重组。不是丈夫+妻子,而是丈夫+妻子and丈夫+岳父and丈夫+岳母and妻子+婆婆… 将计算主业及所需附属等整合在一起抽象出来的概念,就叫进程。 这个概念能够独立运行。涉及到大量计算机资源的配置,如果任由用户程序配置,太过复杂也会冲突。 因此就出现了 操作系统 。 操作系统直接跟底层资源配置打交道,用户程序只需要跟操作系统打交道就行了。 上下文切换(Context Switch) 上下文切换主要是指进程的上下文切换,发生在内核态,由内核调度器执行。 上下文,指的是进程的运行状态。 当一个进程的时间片用完,内核将保存该进程的运行状态(即上下文),将其存入运行队列(Run Queue),同时让新的进程占用CPU。

好程序员:大数据之线程高级部分

妖精的绣舞 提交于 2020-03-11 16:36:10
好程序员:大数据之线程高级部分,首先讲一下线程的生命周期 对于一个线程, 在被创建后, 不是立即就进入到了运行状态, 也不是一直处于运行状态, 在线程的声明周期中, 一个线程会在多种状态之间进行切换 new : 新生状态, 线程被实例化, 但是还没有开始执行(start) runnable: 就绪状态, 已经执行过start, 线程已经启动了, 只是没有抢到CPU时间片 running: 运行状态, 抢到了CPU时间片 blocked: 阻塞状态, 线程执行的过程中, 遇到一些特殊情况, 会进入阻塞状态. 阻塞中的线程, 是不能参数时间片的抢夺的 (不能被线程调度器调度) dead: 死亡状态, 线程终止 ​ 正常死亡 : run方法中的代码执行结束 ​ 非正常死亡 : 强制使用stop方法停止这个线程 临界资源问题 由于线程之间是资源共享的。如果有多个线程,同时对一个数据进行操作,此时这个数据会出现问题。 如果有一个线程在访问一个临界资源,在访问之前,先对这个资源“上锁”,此时如果有其他的线程也需要访问这个临界资源,需要先查这个资源有没有被上锁,如果没有被上锁,此时这个线程可以访问这个资源;如果上锁了,则此时这个线程进入阻塞状态,等待解锁。 ####同步代码段 // 同步代码段 // 小括号:就是锁 // 大括号:同步代码段,一般情况下,写需要对临界资源进行的操作

C++ 线程 获取线程id

本秂侑毒 提交于 2020-03-11 16:30:46
#include "stdafx.h" #include <iostream> #include <thread> #include <string> #include <chrono> #include <mutex> #include <windows.h> using namespace std; std::mutex g_display_mutex; void foo() { std::thread::id this_id = std::this_thread::get_id(); unsigned int t = *(unsigned int*)&this_id;// threadid 转成 unsigned int unsigned int threadid = t; g_display_mutex.lock(); std::cout << "thread" << this_id << " sleeping...\n"; std::cout << "t = " << threadid << endl; g_display_mutex.unlock(); std::this_thread::sleep_for(std::chrono::seconds(1)); } int main() { std::thread t1(foo); std::thread t2(foo);

线程、进程、协程概念辨析

ε祈祈猫儿з 提交于 2020-03-11 16:26:49
线程和进程 线程、进程经常放在一起对比: 《线程||进程||行程||多线程||多进程一次搞清》 《IO密集型任务(多线程)||计算密集型(多进程)》 线程 是最小单位, 进程 内至少包含一个 线程 。 对操作系统来说, 线程 是最小的执行单元, 进程 是最小的资源管理单元。 进程 间的切换(涉及栈、寄存器、虚拟内存、文件句柄等)开销较大,但是相对安全; 不同进程 通过进程间通讯来通信。 线程 是比进程更小的、CPU调度和分派的、能独立运行的基本单位,可与同属一个进程的其他的线程共享进程所拥有的全部资源; 线程间 通信主要通过 共享内存 。 协程概念 协程 ,英文名***Coroutine***。 协程 是一种用户态的轻量级线程,协程的调度完全由用户控制,拥有自己的寄存器上下文和栈。 一台机器只执行一个程序太浪费CPU资源了,当某个程序执行IO时就让出CPU资源交给另一个程序执行,这就是 协程的思想 。 协程是实现异步的一种方式。 从编程角度,协程的思想本质上就是控制流的主动让出(yield)和恢复(resume)机制。 协程与线程/进程的区别 编译器与操作系统 协程 是 编译器 级的,Process和Thread是 操作系统级 的。 操作系统级的意思是对算法的调度是通过OS执行的,每次跑到OS分配的CPU时间后就会被OS强制挂起,开发者无法精确控制他们。 Coroutine

操作系统学习 一

有些话、适合烂在心里 提交于 2020-03-11 14:12:09
操作系统学习 一 目录 操作系统简要 串行、并发、并行的区别 操作系统的演变 操作系统的功能 操作系统的结构设计 操作系统简要 操作系统的目标: 方便性 有效性 可扩充性 开放性 操作系统的作用: 是用户与计算机硬件系统之间的接口 是计算机资源的管理者 实现了对计算机资源的抽象 是计算机工作流程的组织者 两级调度: 低级:进程,高级:作业 低级调配CPU,高级调配内存 操作系统的基本特征 并发性 共享性 虚拟性 异步性 os隐藏了对硬件操作的具体细节,实现了对计算机硬件操作的多个层次的抽象模型 串行、并发、并行的区别 串行:指的我们从事某项工作时一个步骤一个步骤的去实施。 并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。 并行:当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行 操作系统的演变 无操作系统 人工操作方式:低速,人机矛盾 脱机输入/输出方式:缓和了人机矛盾,极大提高了I/O的速度进一步减少了CPU的空闲时间 单道批处理系统 从脱机输入和作业的自动过度,确实提高了机器资源利用率,增加了系统的吞吐量,但是资源仍没有得到充分的利用 多道批处理系统 优点