Hero Image

9 每一日面 字节跳动 很荣幸字节跳动一路走到了四面,不管是运气还是实力,都好好准备接下来的面试吧,加油 编程 判断字符串B是否是字符串A的子串 数据结构中的桶排序、平衡二叉树 .手撕代码:机器人跳跃(牛客原题) 手撕代码:逆时针打印矩阵(剑指offer改) 合并两个有序链表,空间复杂度O(1); DP最长回文串; 给两个1T的文件在2g ram的内存中找出相同项。 给一个有向图,判断有向图中是否有环,如果有环,环的数量是多少? 给一个大小为n的数组,寻找比k小的最大数的位置。 1.最长回文子串 地图上有若干个点,怎样得到某个点到达某个点的所有的换乘路线 ? 是否是联通,如果不连通怎么处理 给你一个字符串,字符串当中是一段c语言的代码和注释,注释只有/** /这样的可以嵌套,不包含// 请返回去除所有注释的代码 如果代码当中的/*和/*可以不完全匹配如何告知出现错误 写了一个程序,有个小球,球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10 次落地时,共经过多少米?第 10 次反弹多高? 写代码:火车售票系统是早7点-晚23点进行网上售票,写一个程序判断是否可以进行网上买票 讲一下二叉搜索树,写节点的删除代码 最大连续子序列和 代码:实现lru,不会哦临时想了一种lgn的实现,面试官不满意 写一个最小堆建堆,分析复杂度 多个串,将含有相同字母的串放到同一个集合,返回集合向量 讲思路 编程:36进制加法(忘记处理最高位的进位,面试官提醒了一下) 在一亿个数中找出最大的10个数,在一亿个数中找出中间的10个数 编程:将0-n的整数放到一个长度为n的数组中,找出缺失的那个数 编程:36进制加法(又来?) 题目:n条直线可以将空间划分为多少个区域 面试题 TCP 和UDP 进程和线程 设计模式 MySQL索引的数据结构 进程间的通信方式 设计一个存储海量评论的结构,要求大量数据的写入,可以随意翻页? 熟悉计算机和网络原理,熟悉操作系统原理,对存储、队列、计算、集群管理中的一项或多项有深入的理解和认识; 常用的排序算法的复杂度,写快排; Java的JVM的内存布局,垃圾回收的实现,回收器分几部分,都有什么作用; 项目大体阐述下,用了哪些技术、设计模式,最大的感受是什么;十分钟实现用过的观察者模式、工厂模式; TCP四次挥手讲下?为什么有TIME_WAIT? TCP比UDP多消耗哪些系统资源? A(FIN_WAIT_1) -> B(CLOSE_WAIT) FIN=1,seq = u A(FIN_WAIT_2)<-B ACK=1, seq=v,ack=u+1; A <-B(LAST_ACK) FIN=1,seq = w,ack=u+1; A(TIME_WAIT) ACK=1 ,seq=u+1,ack=w+1;

Hero Image

#计算机操作系统 基本特征 并发 并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。 并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。 操作系统通过引入进程和线程,使得程序能够并发运行。 共享 共享是指系统中的资源可以被多个并发进程共同使用。 有两种共享方式:互斥共享和同时共享。 互斥共享的资源称为临界资源,例如打印机等,在同一时刻只允许一个进程访问,需要用同步机制来实现互斥访问。 虚拟 虚拟技术把一个物理实体转换为多个逻辑实体。 主要有两种虚拟技术:时(时间)分复用技术和空(空间)分复用技术。 多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。 虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。 异步 异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。 基本功能 进程管理 进程控制、进程同步、进程通信、死锁处理、处理机调度等。 内存管理 内存分配、地址映射、内存保护与共享、虚拟内存等。 文件管理 文件存储空间的管理、目录管理、文件读写管理和保护等。 设备管理 完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。 主要包括缓冲管理、设备分配、设备处理、虛拟设备等。 系统调用 如果一个进程在用户态需要使用内核态的功能,就进行系统调用从而陷入内核,由操作系统代为完成。 Linux 的系统调用主要有以下这些: Task Commands 进程控制 fork(); exit(); wait(); 进程通信 pipe(); shmget(); mmap(); 文件操作 open(); read(); write(); 设备操作 ioctl(); read(); write(); 信息维护 getpid(); alarm(); sleep(); 安全 chmod(); umask(); chown(); 大内核和微内核 大内核 大内核是将操作系统功能作为一个紧密结合的整体放到内核。 由于各模块共享信息,因此有很高的性能。 微内核 由于操作系统不断复杂,因此将一部分操作系统功能移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。 在微内核结构下,操作系统被划分成小的、定义良好的模块,只有微内核这一个模块运行在内核态,其余模块运行在用户态。 因为需要频繁地在用户态和核心态之间进行切换,所以会有一定的性能损失。 中断分类 外中断 由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。

Hero Image

线程同步 线程同步的概念 线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临界区对象就是其中一种。 在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。 线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。 当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。 线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。 线程同步的方式和机制 临界区(Critical Section)、互斥对象(Mutex):主要用于互斥控制;都具有拥有权的控制方法,只有拥有该对象的线程才能执行任务,所以拥有,执行完任务后一定要释放该对象。 信号量(Semaphore)、事件对象(Event):事件对象是以通知的方式进行控制,主要用于同步控制。 临界区 通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。它并不是核心对象,不是属于操作系统维护的,而是属于进程维护的。 1)关键段共有初始化、销毁、进入和离开关键区域四个函数。 2)关键段可以解决线程的互斥问题,但因为具有“线程所有权”,所以无法解决同步问题。 3)推荐关键段与旋转锁配合使用。 互斥量 互斥对象和临界区很像,采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程同时访问。当前拥有互斥对象的线程处理完任务后必须将线程交出,以便其他线程访问该资源。 1)互斥量是内核对象,它与关键段都有“线程所有权”所以不能用于线程的同步。 2)互斥量能够用于多个进程之间线程互斥问题,并且能解决某进程意外终止所造成的“遗弃”问题。 3、信号量:信号量也是内核对象。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 信号量 在用CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最 大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1 ,只要当前可用资源计数是大于0 的,就可以发出信号量信号。但是当前可用计数减小 到0 时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离 开的同时通过ReleaseSemaphore ()函数将当前可用资源计数加1 。在任何时候当前可用资源计数决不可能大于最大资源计数。 事件对象 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 1)事件是内核对象,事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。 2)事件可以由SetEvent()来触发,由ResetEvent()来设成未触发。还可以由PulseEvent()来发出一个事件脉冲。 3)事件可以解决线程间同步问题,因此也能解决互斥问题。 线程同步的方法 (1)wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 (2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉 InterruptedException异常。 (3)notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的 唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。 (4)notityAll ():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁, 而是让它们竞争。

Hero Image
「Java」

Automic 原子类 1 Atomic 原子类介绍 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 所以,所谓原子类说简单点就是具有原子/原子操作特征的类。 并发包 java.util.concurrent 的原子类都存放在java.util.concurrent.atomic下,如下图所示。 根据操作的数据类型,可以将JUC包中的原子类分为4类 基本类型 使用原子的方式更新基本类型 AtomicInteger:整型原子类 AtomicLong:长整型原子类 AtomicBoolean :布尔型原子类 数组类型 使用原子的方式更新数组里的某个元素 AtomicIntegerArray:整型数组原子类 AtomicLongArray:长整型数组原子类 AtomicReferenceArray :引用类型数组原子类 引用类型 AtomicReference:引用类型原子类 AtomicReferenceFieldUpdater:原子更新引用类型里的字段 AtomicMarkableReference :原子更新带有标记位的引用类型 对象的属性修改类型 AtomicIntegerFieldUpdater:原子更新整型字段的更新器 AtomicLongFieldUpdater:原子更新长整型字段的更新器 AtomicStampedReference :原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。 AtomicMarkableReference:原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来,也可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。 CAS ABA 问题 描述: 第一个线程取到了变量 x 的值 A,然后巴拉巴拉干别的事,总之就是只拿到了变量 x 的值 A。这段时间内第二个线程也取到了变量 x 的值 A,然后把变量 x 的值改为 B,然后巴拉巴拉干别的事,最后又把变量 x 的值变为 A (相当于还原了)。在这之后第一个线程终于进行了变量 x 的操作,但是此时变量 x 的值还是 A,所以 compareAndSet 操作是成功。 例子描述(可能不太合适,但好理解): 年初,现金为零,然后通过正常劳动赚了三百万,之后正常消费了(比如买房子)三百万。年末,虽然现金零收入(可能变成其他形式了),但是赚了钱是事实,还是得交税的! 代码例子(以AtomicInteger为例) 1import java.