General Questions
Explain what a process is?
In general a process consists of or ‘owns’ the following:
- A program image to execute, in machine code (think exe on disk)
- Memory, typically some block of virtual memory
- Executable code
- Data (input / output
- Call stack
- Heap, to hold intermediate data
General CLR Questions
1. Explain garbage collection in .Net?
Garbage collection will occur under one of the following conditions:
- The system is running low on physical memory
- The heap surpasses an acceptable threshold. (This threshold is continuously adjusted as the process runs)
- GC.Collect is called
The managed heap
There is a managed heap for each managed process, the heap is initialized by the garbage collector. The garbage collector calls win32 VirtualAlloc to reserve memory and VirtualFree to release memory.
The heap is comprised of the large object heap (objects greater than 85k, normally only arrays) and the small object heap
Generations
The heap is split into generations to manage long-lived and short-lived objects. Garbage collection generally occurs with the reclamation of short-lived objects which normally account for a small portion of the heap
Generation 0: Contains short-lived objects, i.e. temporary variables. Collection occurs most here
Generation 1: Contains short-lived objects, is a buffer between 0 & 2 generations
Generation 2: Contains long-lived objects, i.e. static instances, stateful instances
Types of garbage collection
Workstation mode
More suitable for long-running desktop applications, adds support for concurrent garbage collection which should mean that the application is more responsive during a collection.
Server mode
Best suited for asp.net, only supported on multi-processor machines
References
2. What is boxing / unboxing?
Boxing occurs when a value type is passed to a method which expects an object or a value type is implicitly cast to an object.
ArrayList x = new ArrayList(); x.Add(10); // Boxing
int x = 10; Object y = x; // Boxing
Unboxing is the reverse of this process, taking an object and casting it back to the value type.
int x = 10;
Object y = x; // Boxing
x = (int) y; // Unboxing
Problem?
Yes there is a performance cost when an item is boxed a new item must be created and allocated on the heap, 20x as long as a simple reference assignment. 4x penalty for unboxing.
Now with generics some use cases for boxing/unboxing go away. However in silverlight/WPF value convertors and dependency objects can cause lots of boxing to occur
3. What is a struct, when should you use one?
A struct is a value type and should be choosen instead of class if:
- It logically represents a single value
- Has an instance size smaller than 16 bytes
- It is immutable
- It will not be boxed frequently
4. What are weak references, why do you need them?
Enables you to take out a reference to an object without stopping the garbage collector from reclaiming that object.
Useful if you have very large objects, which are easy to recreate.
5. What is the dispose pattern?
The dispose pattern is used only for objects that access unmanaged resources. The garbage collector is very efficient in reclaiming memory of managed objects but has no knowledge of memory used by unmanaged native objects.
6. What is the difference between a Dictionary<TKey, TValue> and Hashtable?
Dictionary<TKey, TValue> | Hashtable |
---|---|
Minimizes boxing/unboxing | boxes value types: Add(object,object) |
Needs synchronization | Provides some sychronization via Hashtable.Synchronized(Hashtable) method |
Newer >.net 2.0 | Older Since 1.0 |
If key not found throws KeyNotFoundException | If key not found returns null |
Note that internally dictionary is implemented as a hashtable.
7. What is the cost of looking up an item in a Hashtable?
Retrieving the value of a dictionary or hashtable using it’s key is very fast close to O(1) in big-o notation. The speed of retrieval depends on the quality of the hashing algorithm of the type specified for TKey
Multi-threading Questions
1. How would you engineer a deadlock
- Create two methods each acquiring a separate lock, that call each other say 5 times
- Start two threads on separate methods
class Program { private static int operations = 5; public static object lockA = new object(); public static object lockB = new object(); static void Main(string[] args) { Thread thread1 = new Thread(DoSomethingA); Thread thread2 = new Thread(DoSomethingB); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); Console.WriteLine(operations); Console.ReadKey(); } public static void DoSomethingA() { lock (lockA) { Console.WriteLine("Lock DoSomething A " + Thread.CurrentThread.ManagedThreadId); if (operations > 0) { operations = operations - 1; Thread.Sleep(100); DoSomethingB(); } } Console.WriteLine("Release DoSomething A " + Thread.CurrentThread.ManagedThreadId); } public static void DoSomethingB() { lock (lockB) { Console.WriteLine("Lock DoSomething B " + Thread.CurrentThread.ManagedThreadId); if (operations > 0) { operations = operations - 1; Thread.Sleep(100); DoSomethingA(); } } Console.WriteLine("Release DoSomething B " + Thread.CurrentThread.ManagedThreadId); } }
2. What are race conditions, how to stop them
Occur when more than one thread attempts to update shared data:
int x = 10;
…..
// Thread 1
x = x – 10;
// Thread 2
x = x + 1
To stop race conditions from happening you need to obtain exclusive locks, use semaphor, mutex, readwriterslim lock mechanism
3. What are some lock-less techniques for avoiding race conditions?
You can use volatile or Thread.MemoryBarrier() or the Interlocked class
4. What is does the keyword Volatile mean or do?
It ensures that the value of the field is always the most up-to-date value. Commonly used in multi-threaded applications that do not use locks to serialize access to shared data. When using a lock it causes the most up-to-date value to be retrieved.
Values can become stale when threads run on different processors asynchronously.
5. What is differenct between ManualResetEvents and AutoResetEvents?
When signaled via ‘Set’ threads waiting can all proceed until Reset() is called. With auto reset event only one waiting thread is unblocked when signalled ‘Set’ and the wait handle goes back to blocking other waiting threads until the next ‘Set’ message is sent.
Reactive Extensions (RX)
1. What are the IObservable<T> and IObserver<T> interfaces
IObservable<T> is a collection of things that can watched and defines a provider for push-based notification. And must implement a subscribe method.
IObserver<T> is essentially the listener to the collection and needs to implement OnNext, OnError, OnCompleted
Collections
1. What is the difference between IEnumerable<T> and IEnumerator<T>
IEnumerable<T> is a thing which can be enumerated over. Returns an IEnumerator
IEnumberator<T> is the thing that can do the enumeration, knows how to navigate the collection
Software design
1. List some design patterns
Creational patterns
Abstract factory
Provide an interface for creating families of related or dependent objects without specifying their concrete classes
http://en.wikipedia.org/wiki/Abstract_factory_pattern
Builder Pattern
Defines abstract interfaces and concrete classes for building complex objects
http://en.wikipedia.org/wiki/Builder_pattern
Singleton Pattern
Ensure a class only has one instance, and to provide a global point to access it.
Structural Patterns
Façade Pattern
A facade is an object that provides a simplified interface to a larger body of code
Pasted from <http://en.wikipedia.org/wiki/Facade_pattern>
Decorator
Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.
Pasted from <http://en.wikipedia.org/wiki/Design_pattern_(computer_science)>
2. What is SOLID?
Initial |
Stands for(acronym) | Concept |
---|---|---|
S | SRP |
|
O | OCP |
|
L | LSP |
|
I | ISP |
|
D | DIP |
|